package cn.jh.common.core.cn;

import cn.jh.common.core.domain.EnumValue;
import cn.jh.common.core.domain.TextValue;
import cn.jh.common.core.i18n.I18n;
import com.fasterxml.jackson.annotation.JsonValue;
import org.jetbrains.annotations.NotNull;

import java.util.Locale;

/**
 * 中国银行卡类型。
 *
 * @author Fuchun
 * @since 1.0
 */
public enum CardType implements EnumValue<String>, TextValue<String, String> {

    UNKNOWN("cardType.unknown", "未知卡"),

    DC("cardType.dc", "储蓄卡"),

    CC("cardType.cc", "信用卡"),

    SCC("cardType.scc", "准贷记卡"),

    PC("cardType.pc", "预付费卡")
    ;

    final String i18nCode;
    final String defaultText;

    CardType(String i18nCode, String defaultText) {
        this.i18nCode = i18nCode;
        this.defaultText = defaultText;
    }

    @Override
    public String getText() {
        return getText(Locale.getDefault());
    }

    @Override
    @JsonValue
    public String getValue() {
        return name();
    }

    public String getText(Locale locale) {
        return I18n.getOrDefault(i18nCode, locale, defaultText);
    }

    public String getI18nCode() {
        return i18nCode;
    }

    public String getDefaultText() {
        return defaultText;
    }

    /**
     * 返回给定字符串表示的{@code CardType}。
     * 如果给定的字符串不能表示为{@code CardType}，则默认返回{@code #UNKNOWN}
     *
     * @param input 给定的字符串。
     * @return 返回给定字符串表示的{@code CardType}
     */
    @NotNull
    public static CardType forString(String input) {
        String v;
        if (input == null || (v = input.trim().toUpperCase()).isEmpty()) {
            return UNKNOWN;
        }
        for (CardType ct : values()) {
            if (ct.getValue().equals(v)) {
                return ct;
            }
        }
        return UNKNOWN;
    }
}
